







var request = null;

/* Construcción de una petición
 * Parámetros:
 *    reqType: el tipo de request GET or POST
 *    url: la URL a invocar
 *    asynch: Para indicar si ejecutamos la petición de forma asíncrona
 *    funcion: funcion que se registra para onreadystatechange
 */
function httpRequest(reqType, url, parametros, asynch, funcion) {
    //mozilla based
    if(window.XMLHttpRequest) {
        request = new XMLHttpRequest();
        if(request.overrideMimeType) {
            request.overrideMimeType("text/xml");
        }
    } else if(window.ActiveXObject) {
        request = new ActiveXObject("Msxml2.XMLHTTP");
        if(!request) {
            request = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    //comprueba que request se ha creado ok
    if(request) {
       initReq(reqType, url, parametros, asynch, funcion);
    } else {
       alert("Su navegador no es compatible con esta aplicación");
    }
}

//Inicializa una petición y la envía
function initReq(reqType, url, parametros, bool, funcion) {
    try {
        request.onreadystatechange = funcion
        request.open(reqType, url, bool);
        if(parametros != null) {
            request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        }
        request.send(parametros);
    } catch (errv) {
        alert("No se pudo contactar con el servidor\nPor favor, vuelva a intentarlo");
        alert(errv);
    }
}

function addEvent(obj, evType, fn){ 
    if (obj.addEventListener){ 
        obj.addEventListener(evType, fn, false); 
        return true; 
    } else if (obj.attachEvent){ 
        var r = obj.attachEvent("on" + evType, fn); 
        return r; 
    } else { 
        return false; 
    } 
}

addEvent(window, 'load', onLoadDeClasificar);

var codigoDeClasificacion;
var grupoDeSelects;
var nivel;

//manejadores de eventos del formulario
function onLoadDeClasificar() {
    var todosLosSelect = document.getElementsByTagName("select");
    
    if(todosLosSelect != null) {
        for(var i = 0; i < todosLosSelect.length; i++) {
            
            if(todosLosSelect[i].getAttribute("id").substring(0, 8) == "elemento") {
                todosLosSelect[i].onchange = function() {
                    getListaDeElementosDeClasificacion(this);
                }
            }
        }
    }
}

//llamada a la lista de provincias
function getListaDeElementosDeClasificacion(select) {
    var aux = select.getAttribute("id").substring(9);
    var posicionDeSeparador = aux.indexOf("_");
    codigoDeClasificacion = aux.substr(0, posicionDeSeparador);
    aux = aux.substr(posicionDeSeparador + 1);
    posicionDeSeparador = aux.indexOf("_");
    grupoDeSelects = aux.substr(0, posicionDeSeparador);
    nivel = aux.substr(posicionDeSeparador + 1);
    
    var url = "/servlet/lista_elementos_clasificacion?codigo_de_elemento=" + encodeURIComponent(select.value) +
    "&codigo_de_clasificacion=" + encodeURIComponent(codigoDeClasificacion);
    
    httpRequest("GET", url, null, true, manejarRespuestaDeListaDeElementosDeClasificacion);
}

//manejador de la respuesta de XMLHttpRequest
function manejarRespuestaDeListaDeElementosDeClasificacion() {
    try {
        if(request.readyState == 4) {
            
            if(request.status == 200) {  
                
                var respuesta =  request.responseXML.documentElement;
                if(respuesta != null) {
                    
                    if(respuesta.nodeName == "respuesta") {
                        var estado = respuesta.getElementsByTagName("estado");
                        if(estado[0].getAttribute("valor") == "ok") {
                            redibujarElementosDeClasificacion(respuesta);
                        }
                    }
                } else {
                    alert("Tipo de respuesta no esperada\nPor favor, vuelva a intentarlo");
                }
            } else {
                alert("Ha ocurrido un problema comunicando con el servidor\nPor favor, vuelva a intentarlo");
            }
        }
    } catch (err) {
        alert("Ha ocurrido un error procesando su petición\nPor favor, vuelva a intentarlo");
    }
}

function getListaDeElementosDePrimerNivelDeClasificacion(select) {
    var aux = select.getAttribute("id").substring(9);
    var posicionDeSeparador = aux.indexOf("_");
    codigoDeClasificacion = aux.substr(0, posicionDeSeparador);
    aux = aux.substr(posicionDeSeparador + 1);
    posicionDeSeparador = aux.indexOf("_");
    grupoDeSelects = aux.substr(0, posicionDeSeparador);
    nivel = 1;
    
    var url = "/servlet/lista_elementos_clasificacion?codigo_de_clasificacion=" + encodeURIComponent(codigoDeClasificacion);
    
    httpRequest("GET", url, null, true, manejarRespuestaDeListaDeElementosDePrimerNivelDeClasificacion);
}

//manejador de la respuesta de XMLHttpRequest
function manejarRespuestaDeListaDeElementosDePrimerNivelDeClasificacion() {
    try {
        if(request.readyState == 4) {
            
            if(request.status == 200) {  
                
                var respuesta =  request.responseXML.documentElement;
                if(respuesta != null) {
                    
                    if(respuesta.nodeName == "respuesta") {
                        var estado = respuesta.getElementsByTagName("estado");
                        if(estado[0].getAttribute("valor") == "ok") {
                            redibujarElementosDePrimerNivelDeClasificacion(respuesta);
                        }
                    }
                } else {
                    alert("Tipo de respuesta no esperada\nPor favor, vuelva a intentarlo");
                }
            } else {
                alert("Ha ocurrido un problema comunicando con el servidor\nPor favor, vuelva a intentarlo");
            }
        }
    } catch (err) {
        alert("Ha ocurrido un error procesando su petición\nPor favor, vuelva a intentarlo");
    }
}

function redibujarElementosDePrimerNivelDeClasificacion(respuesta) {
    var selectDeElementosDeClasificacion = document.getElementById("elemento_" + codigoDeClasificacion + "_" + grupoDeSelects + "_1");
    if(selectDeElementosDeClasificacion != null) {
        var conjuntoDeElementos = respuesta.getElementsByTagName("elementos");
        var elementos = null;
        
        if(conjuntoDeElementos.length != 0) {
            elementos = conjuntoDeElementos[0].childNodes;
            
            if(elementos.length != 0) {
                selectDeElementosDeClasificacion.disabled = false;
                selectDeElementosDeClasificacion.options[0] = new Option("Seleccione un elemento...");
                for(var i = 0; i < elementos.length; i++) {
                    var codigoDeElemento = elementos[i].getAttribute("codigo");
                    selectDeElementosDeClasificacion.options[i + 1] = new Option(codigoDeElemento + " - " + elementos[i].getAttribute("nombre"), codigoDeElemento);
                }
            }
        }
    }
}

function redibujarElementosDeClasificacion(respuesta) {
    var nivelDeSelect = parseInt(nivel) + 1;
    var selectDeElementosDeClasificacion = document.getElementById("elemento_" + codigoDeClasificacion + "_" + grupoDeSelects + "_" + nivelDeSelect);
    if(selectDeElementosDeClasificacion != null) {
        resetSelectDeInstituciones(selectDeElementosDeClasificacion);
        
        var conjuntoDeElementos = respuesta.getElementsByTagName("elementos");
        var elementos = null;
        
        
        if(conjuntoDeElementos.length != 0) {
            elementos = conjuntoDeElementos[0].childNodes;
            
            if(elementos.length != 0) {
                selectDeElementosDeClasificacion.disabled = false;
                selectDeElementosDeClasificacion.options[0] = new Option("Seleccione un elemento...");
                for(var i = 0; i < elementos.length; i++) {
                    var codigoDeElemento = elementos[i].getAttribute("codigo");
                    selectDeElementosDeClasificacion.options[i + 1] = new Option(codigoDeElemento + " - " + elementos[i].getAttribute("nombre"), codigoDeElemento);
                }
            }
            
            nivelDeSelect++;
        }
        
        //Tengo que deshabilitar el resto de selects por debajo
        var selectDeElementosDeClasificacionInferior = document.getElementById("elemento_" + codigoDeClasificacion + "_" + grupoDeSelects + "_" + nivelDeSelect++);
        while(selectDeElementosDeClasificacionInferior != null) {
            resetSelectDeInstituciones(selectDeElementosDeClasificacionInferior);
            selectDeElementosDeClasificacionInferior.disabled = true;
            selectDeElementosDeClasificacionInferior = document.getElementById("elemento_" + codigoDeClasificacion + "_" + grupoDeSelects + "_" + nivelDeSelect++);
        }
    }
}

function resetSelectDeInstituciones(selectDeInstituciones) {
    if(selectDeInstituciones != null && selectDeInstituciones.hasChildNodes()) {
        var tamano = selectDeInstituciones.childNodes.length;
        for(var i = tamano - 1; i >= 0; i--){
            selectDeInstituciones.removeChild(selectDeInstituciones.childNodes[i]);
        }
    }
}

function anadir(codigoDeClasificacion) {
    var i = 0;
    var listaDeClasificacion = document.getElementById("listaDeClasificacion" + codigoDeClasificacion);
    
    var numeroDeRegistroActual = listaDeClasificacion.childNodes.length + 1;
    var elementoDeLista = document.createElement("li");
    
    elementoDeLista.setAttribute("id", "grupo_" + codigoDeClasificacion + "_" + numeroDeRegistroActual);
    
    var listaNumerada = document.createElement("ol");
    var select = document.createElement("select");
    
    select.setAttribute("id", "elemento_" + codigoDeClasificacion + "_" + numeroDeRegistroActual + "_1");
    getListaDeElementosDePrimerNivelDeClasificacion(select);
    
    //Hay que obtener el n�mero de niveles de la clasificaci�n
    for(var i = 0; i < 3; i++) {
        select.setAttribute("name", "elemento-" + numeroDeRegistroActual + "-" + (i + 1));
        select.onchange = function() {
            getListaDeElementosDeClasificacion(this);
        }

        var elementoNumerado = document.createElement("li");
        var label = document.createElement("label");
        
        var span = document.createElement("span");
        span.className = "textoDeLabel";
        span.appendChild(document.createTextNode("Nivel " + (i + 1) + " "));
        label.appendChild(span);
        
        label.appendChild(select);
        
        elementoNumerado.appendChild(label);
        listaNumerada.appendChild(elementoNumerado);
        
        elementoNumerado = document.createElement("li");
        select = document.createElement("select");
        
        select.setAttribute("id", "elemento_" + codigoDeClasificacion + "_" + numeroDeRegistroActual + "_" + (i + 2));
        select.disabled = true;
    }

    elementoDeLista.appendChild(listaNumerada);

    var div = document.createElement("div")
    div.className = className="botonesDeFormulario";
    var div2 = document.createElement("div");
    elementoDeLista.appendChild(div);
    div.appendChild(div2);

    var botonParaBorrar = document.createElement("button");
    div2.appendChild(botonParaBorrar);

    botonParaBorrar.onclick = function() {
        borrarGrupo(codigoDeClasificacion, numeroDeRegistroActual);
    }
    botonParaBorrar.appendChild(document.createTextNode("Borrar"));

    listaDeClasificacion.appendChild(elementoDeLista);
}

function guardar(codigoDeDocumento, tipoDeDocumento, codigoDeClasificacion) {
    var listaDeClasificacion = document.getElementById("listaDeClasificacion" + codigoDeClasificacion);
    
    var selects = listaDeClasificacion.getElementsByTagName("select");
    
    var parametros = new Array();
    parametros.push("codigoDeDocumento=");
    parametros.push(encodeURIComponent(codigoDeDocumento));
    parametros.push("&tipoDeDocumento=");
    parametros.push(encodeURIComponent(tipoDeDocumento));
    parametros.push("&codigoDeClasificacion=");
    parametros.push(encodeURIComponent(codigoDeClasificacion));
    
    for(var i = 0; i < selects.length; i++) {
        var select = selects[i];
        parametros.push("&");
        parametros.push(encodeURIComponent(select.getAttribute("name")));
        parametros.push("=");
        parametros.push(encodeURIComponent(select.value));
    }
    
    httpRequest("POST", "/servlet/clasificar", parametros.join(""), true, manejarRespuestaDeClasificacion);
}

function borrarGrupo(codigoDeClasificacion, numeroDeGrupo) {
    var grupoABorrar = document.getElementById("grupo_" + codigoDeClasificacion + "_" + numeroDeGrupo);
    if(grupoABorrar != null) {
        grupoABorrar.parentNode.removeChild(grupoABorrar);
    }
}

function manejarRespuestaDeClasificacion() {
    try {
        if(request.readyState == 4) {
            
            if(request.status == 200) {  
                
                var respuesta =  request.responseXML.documentElement;
                if(respuesta != null) {
                    
                    if(respuesta.nodeName == "respuesta") {
                        var estado = respuesta.getElementsByTagName("estado");
                        if(estado[0].getAttribute("valor") == "ok") {
                            alert("Se ha guardado correctamente la clasificacion");
                        }
                    }
                } else {
                    alert("Tipo de respuesta no esperada\nPor favor, vuelva a intentarlo");
                }
            } else {
                alert("Ha ocurrido un problema comunicando con el servidor\nPor favor, vuelva a intentarlo");
            }
        }
    } catch (err) {
        alert("Ha ocurrido un error procesando su petición\nPor favor, vuelva a intentarlo");
    }
}